package com.droowa.model.service;

import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.droowa.domain.BoardManagement;
import com.droowa.domain.BoardPaper;
import com.droowa.model.dao.BoardManagementDAO;
import com.droowa.model.dao.BoardPaperDAO;
import com.droowa.util.BoardPagingBean;
import com.droowa.util.BoardUtilities;
import com.droowa.util.PagingBean;

@Service
public class BoardPaperServiceImpl implements BoardPaperService {
	
	@Autowired
	BoardManagementDAO bmDAO;
	@Autowired
	BoardPaperDAO dao;
	
	@Override
//	페이징 처리 목록 조회 메소드.
//	조회한 게시물들(ArrayList)와 페이징 처리를 위한 PagingBean의 객체를 생성해 Map에 넣어 return 처리한다.
	public Map getBoardPaperList(int bid, int page) throws SQLException {
		HashMap map = new HashMap();
//		1. DAO메소드를 이용해 매개변수로 받은 페이지에 보여줄 게시물들을 ArrayList로 조회
		BoardManagement bm = bmDAO.searchBoardManagementId(bid);
		//bm.getPagingListNum();	//한페이지에 표시할 게시물 목록수
		//bm.getPagingNum();	//리스트 하단의 페이지 번호
		List<BoardPaper> list = dao.selectBoardPaperList(bm, page);
		map.put("boardId", bid);
		map.put("list", list);
//		2. PagingBean객체를 생성 ( 필요 정보 : 전체 게시물의 개수, 보고자 하는 페이지 번호)
//		2-1 : DAO의 메소드를 이용해 전체 게시물 수 조회
		int totalContent = dao.selectTotalContent(bid);
//		2-2 : PagingBean 객체 생성
		BoardPagingBean pagingBean = new BoardPagingBean(totalContent, page, bm.getPagingListNum(), bm.getPagingNum());
		System.out.println("totalContent : " + totalContent + " / totalPage : " + pagingBean.getEndPageOfPageGroup());
		map.put("pagingBean", pagingBean);
		return map;
	}

	@Override
	public int writeContent(int bid, BoardPaper paper) throws SQLException {
		//1. 입력일시와 사용자가 입력한 글의 내용을 DB용으로 변환한 것을 매개변수로 받은 board에 설정한다.
		String content = BoardUtilities.changeContentForDB(paper.getContent());
		paper.setContent(content);
		//2. DAO를 이용해 글을 DB에 등록한다.
		dao.insertContentForNewCount(paper, bid);
		return 0;
	}

	@Override
	public BoardPaper getContentByNO(int bid, int num)
			throws SQLException {
		//1. DAO의 메소드를 이용해 조회수를 1 증가 시킨다.
		dao.updateViewCount(bid, num);
		//2. DAO의 메소드를 이용해 글 정보 조회
		BoardPaper paper = dao.selectContentByNO(bid, num);
		paper.setBoardId(Integer.toString(bid));
		return paper;
	}

	@Override
	public BoardPaper getContentByNoForForm(int bid, int num)
			throws SQLException {
		//1. no값으로 글 조회
		BoardPaper paper = dao.selectContentByNO(bid, num);
		//2. content를 textarea용으로 변경
		paper.setContent(BoardUtilities.changeContentForTextArea(paper.getContent()));
		paper.setBoardId(Integer.toString(bid));
		return paper;
	}

	@Override
	public int modifyContent(BoardPaper paper) throws SQLException {
		//1. 입력일시와 사용자가 입력한 글의 내용을 DB용으로 변환한 것을 매개변수로 받은 board에 설정한다.
		paper.setContent(BoardUtilities.changeContentForDB(paper.getContent()));
		//2. DAO 메소드를 이용해 수정 처리
		dao.updateContent(paper);
		return 0;
	}

	@Override
	public int deleteContentByNO(int bid, int num) throws SQLException {
		dao.deleteContentByNO(bid, num);
		return 0;
	}

	@Override
	public int replyContent(BoardPaper paper) throws SQLException {
		//1. DAO의 메소드를 이용해 DB에 같은 refamily의 게시물들 중 답변하고자하는 글의 restep 보다 큰 게시물들의 restep들을 1씩 증가시킨다.
		dao.updateRestep(Integer.parseInt(paper.getBoardId()), paper.getRefamily(), paper.getRestep());
		//2. 등록하려는 게시물 데이터(매개변수로 받은 board)의 restep, relevel을 1 증가시킨다. - board가 가지고 있는 것은 원본글의 값이므로 자신의 값으로 변경하는 것.
		paper.setRestep(paper.getRestep()+1);
		paper.setRelevel(paper.getRelevel()+1);
		//3. 사용자가 입력한 글의 내용을 DB용으로 변환한 것을 매개변수로 받은 board에 설정한다.
		paper.setContent(BoardUtilities.changeContentForDB(paper.getContent()));
		//4. DAO의 메소드를 이용해 글을 DB에 넣는다.
		dao.insertContentForReply(paper);
		return 0;
	}	
	
	
	
}
